SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[pje_porAnosDeServiciosTecnicos] @idInscripcion as integer,@puntaje as float output ,@resultado as int output  AS
set nocount on --para anular el trafico econ el cliente (no salen los print)
set dateformat mdy

declare  @idAgente as int,@CargoGenerico as int,@AsignaturaGenerica as int, @idTipoConvocatoria as int ,@fechaLimite as datetime,@modalidad as integer,@nivel_insc as int,@modalidad_insc as int, @ciclo as int

declare @topeServiciosEnElCargo as  float
declare @v1i as datetime,@v1f as datetime,@v2i as datetime,@v2f as datetime,@fini as datetime,@ffin as datetime,@fFinProyectada as datetime

declare @ASCargo as int, @puntajeCargo as float
declare @nivel_del_cargo as integer --nivel del cargo en que se inscribió

declare @fechaCierreDeInscripciones as datetime,@fecharef as datetime

declare @Fecha_de_Alta_Servicio as datetime,@Fecha_de_Baja_Servicio as datetime
declare @FechaInicioVacaciones as datetime, @fechafinVacaciones as datetime
declare @cantdias as float, @calculo as float,@Pini as datetime,@pfin as datetime,@i as integer, @fecha_aux as datetime
declare @CantDiasAcumulados as float
declare @Minimo as datetime,@Maximo as datetime
declare @grupoincumbencia as integer

DECLARE @Error INT

BEGIN TRANSACTION
             SET @ERROR=0


--select @topeServiciosEnElCargo =(select valor from tb_topetiposantecedentes where rubro=xx and TipoAntecedente =yy )-- leo el  tope por Servicios en el cargo
select @topeServiciosEnElCargo = (select valor1 from tb_parametros where idparametro=99) -- leo el  tope porNivel           ver el codigo 99  
set @topeServiciosEnElCargo= isnull(@topeServiciosEnElCargo,9999)

select @FechaInicioVacaciones = (select cast (valor1 as datetime) from tb_parametros where idparametro=1) -- leo la fecha de inicio del período vacacional
select @fechafinVacaciones = (select cast (valor1 as datetime) from tb_parametros where idparametro=26) -- leo la fecha de finalización del período vacacional


select  @idAgente=i.Agente,@cargoGenerico = i.CargoGenerico,@AsignaturaGenerica=i.AsignaturaGenerica,@idtipoConvocatoria=Conv.TipoConvocatoria,@FechaLimite=Conv.FechaLimite,@fechaCierreDeInscripciones=Conv.fechaCierre,@FechaInicioVacaciones=FechaInicioVacaciones,@FechaFinVacaciones=FechaFinVacaciones,@nivel_insc = i.nivel,@modalidad_insc=i.modalidad,@ciclo = ciclo
	from 
	tb_inscripcionesConvocatorias i 
		join tb_Convocatorias conv on i.Convocatoria=conv.idConvocatoria 
	where i.idInscripcionConvocatoria=@idInscripcion

if @nivel_insc = 3 and @ciclo = 2 set  @nivel_insc=4

select @grupoIncumbencia=case
	when @nivel_insc = 2 then 570
	when @nivel_insc = 3 then 570
	when @nivel_insc = 4 then 571
end



	DECLARE  c CURSOR FORWARD_ONLY FOR
	SELECT distinct s.FechaAlta,isnull(s.FechaBaja,@fechaCierreDeInscripciones) FROM 
		tb_ServiciosHistoricos s 
		join tb_cargosafines a on s.cargoGenerico=IdCargoGenerico and s.AsignaturaGenerica=IdAsigGenerica
		join tb_gruposDeIncumbencias G on G.idGrupoIncumbencia=s.GrupoIncumbencias
--		join tb_reluniongsgu R on r.idgrupounion = G.idGrupoIncumbencia
		join tb_incumbencias h on G.idGrupoIncumbencia=h.grupoIncumbencia
	WHERE s.IdAgente=@idAgente and  (h.grupoIncumbencia=@grupoIncumbencia   or h.grupoIncumbencia=99 ) 
	and (s.cargoGenerico = 495 and s.AsignaturaGenerica = 0 or (a.idCargoGenericoAfin=495 and idAsigGenericaAfin=0)) and s.FechaPresentacion <= @FechaLimite
	ORDER BY s.FechaAlta


		SET @Error = @@ERROR 
		IF @Error <> 0 GOTO Salir


	set @puntaje = 0
	set @maximo=cast ('01/01/1900' as datetime) --artificio para que el primer período siempre se sume

	OPEN c
	FETCH NEXT FROM c INTO @Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio

             set @CantDiasAcumulados = 0 --inicializo en cero la variable que acumulará la cantidad de días de servicios prestados por el agente
	

WHILE @@fetch_status = 0


BEGIN

		 set @fini = @Fecha_de_Alta_Servicio
    
		    -- Fijo las Fechas de Baja abiertas     

		set @ffin = isNull(@Fecha_de_Baja_Servicio,@FechaCierreDeInscripciones)  --si la fecha de baja es null le asigno la fecha de cierre de inscripciones
		if @Fecha_de_Baja_Servicio < @Fecha_de_Alta_Servicio or @Fecha_de_Baja_Servicio>@FechaCierreDeInscripciones or @Fecha_de_Baja_Servicio = cast('01/01/2000' as datetime) or @Fecha_de_Baja_Servicio = cast('01/01/1900' as datetime)
			set @ffin= @FechaCierreDeInscripciones
		else 
			set @ffin= @Fecha_de_Baja_Servicio
		--Calculo los períodos vacacionales mas proximos
		set @v1i=@FechaInicioVacaciones
		while @v1i > @fini
		begin
			
		 set @v1i =dateadd(year,-1,@v1i) --Cast(str(datepart(mm,@FechaInicioVacaciones)) + '/'+str(datepart(dd,@FechaInicioVacaciones))+'/'+str(datepart(yyyy,@v1i)-1) as datetime)
		end
		set @v1f = @v1i + (@FechaFinVacaciones - @FechaInicioVacaciones)
		set @v2f = @v1f
		while @v2f<@ffin or @v2f=@v1f 
		begin

			set @v2f =dateadd(year,1,@v2f)
		end
		
		set @v2i = @v2f - (@FechaFinVacaciones - @FechaInicioVacaciones)

		--Empieza y Termina en las mismas Vacaciones

		if (@fini < @v1f  AND @ffin < @v1f)  set @cantdias= datediff(dd,@fini,@ffin)

		--   Empieza en unas vacaciones y termina en otras
		if @fini < @v1f AND @ffin >= @v2i  and @ffin < @v2f
		begin          --atencion, si fini y ffin tienen el mismo año, topear con 365
		--print 'Empieza en unas vacaciones y termina en otras ' 	
            		         If datepart (yyyy,@fini) = datepart(yyyy,@ffin) 
             	             		    set @cantdias = 365
                   	    	Else
              	          		set @cantdias = datediff(dd,@fini,@v2f)   --datediff(xx,comienzo,fin) = fin - comienzo
		end

		-- Empieza en Vacaciones y finaliza en periodo lectivo del mismo año
		
		if @fini < @v1f AND @ffin >= @v1f AND @ffin <=  dateadd(year,1,@v1i) --cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime)--(@v1i + 365) 
			begin
				--print 'Empieza en Vacaciones y finaliza en periodo lectivo del mismo año '
				set @calculo=round(datediff(dd,@v1f,@ffin) * 1.33,0)
				exec @cantdias = sp_minimo 365, @calculo
				set @cantdias=@cantdias+ datediff(dd,@fini,@v1f)
				--set  @cantdias = (@v1f - @fini) +  min( 365, (@ffin - @v1f) * 1.33)
			end

		--Empieza en Vacaciones y finaliza en periodo lectivo de otro año
		
		if @fini < @v1f AND  @ffin >=  dateadd(year,1,@v1f) --cast(str(datepart(mm,@v1f)) + '/'+str(datepart(dd,@v1f))+'/'+str(datepart(yyyy,@v1f)+1) as datetime)-- and @ffin >= @v2i --está mal esta condición (and @ffin < @v2i), lo arreglé el 08/04/2005
		begin
			--print 'Empieza en Vacaciones y finaliza en periodo lectivo de otro año '
			set @fecha_aux=@v2f
			set @fecha_aux=dateadd(dd,-365,@fecha_aux) -- ojo le resto 365 dias
			set @calculo=round (datediff(dd,@fecha_aux,@ffin)* 1.33,0)
			exec @cantdias = sp_minimo 365,  @calculo
			set @cantdias=@cantdias+datediff(dd,@fini,@fecha_aux)
			--set  @cantdias = min(365, (@ffin - (@v2f - 365)) * 1.33) + ((@v2f - 365) - @fini)
		end

		--Empieza en período Lectivo y finaliza en vacaciones del mismo año

		if @fini >= @v1f AND  @ffin >= (@v1i + 365)  AND @ffin <=  dateadd(year,1,@v1f) --cast(str(datepart(mm,@v1f)) + '/'+str(datepart(dd,@v1f))+'/'+str(datepart(yyyy,@v1f)+1) as datetime)--@ffin <= (@v1f + 365) 
		begin
			--print 'Empieza en período Lectivo y finaliza en vacaciones del mismo año'
			set @fecha_aux=@v1i
			set @fecha_aux=dateadd(dd,365,@fecha_aux) -- ojo le sumo 365 dias
--			set @calculo = round(datediff(dd,@fini,dateadd(dd,365,@fecha_aux)) * 1.33,0)
			set @calculo = round(datediff(dd,@fini,@fecha_aux) * 1.33,0)
			exec @cantdias = sp_minimo 365,@calculo
			set @calculo=datediff(dd,@fini,@ffin)
			exec @cantdias= sp_maximo @cantdias,@calculo
  		  	--set @cantdias = max(min(365, ((@v1i + 365) - @fini) * 1.33), (@ffin - @fini))
		end

		--Empieza en periodo lectivo y termina en otras vacaciones

		if @fini >= @v1f and @ffin >= @v2i and datediff(yy,@v1i,@v2i) >1--@ffin >= cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime) -- @ffin >= dateadd(dd,365,@v1i ) 
		begin
			--print 'Empieza en periodo lectivo y termina en otras vacaciones '
			set   @cantdias = datediff(dd,@fini,@v2f)
		end
		--    Empieza y termina en el mismo periodo lectivo
		if @fini >= @v1f and @ffin < dateadd(year,1,@v1i)--cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime) --(@v1i + 365)  
		begin
			--print 'Empieza y termina en el mismo periodo lectivo '
			set @calculo=round(datediff(dd,@fini,@ffin) * 1.33,0)
			exec @cantdias =  sp_minimo 365, @calculo
		end	

		 --Empieza en periodo lectivo y termina en otro
		if   @fini >= @v1f and @ffin < @v2i and datediff(yy,@v1i,@v2i) >1 --@ffin >= cast(str(datepart(mm,@v1i)) + '/'+str(datepart(dd,@v1i))+'/'+str(datepart(yyyy,@v1i)+1) as datetime)--@ffin >= dateadd(dd,365,@v1i) 
		begin
			--print 'Empieza en periodo lectivo y termina en otro '
			set @fecha_aux=@v2f
			set @fecha_aux=dateadd(dd,-365,@fecha_aux) -- ojo le resto 365 dias
			set @calculo=round(datediff( dd,@fecha_aux,@ffin ) * 1.33,0)
			exec @cantdias=  sp_minimo 365,@calculo
			set @cantdias=@cantdias+datediff(dd,@fini,@fecha_aux)
		--		set @cantdias = ((@v2f - 365) - @fini) + min(365, (@ffin - (@v2f - 365)) * 1.33)
		end

		-- Calculo la proyeccion del servicio
		
		-- corro la fecha de baja hasta la de baja del servicio más los días que le corresponde por el proporcional de vacaciones
		-- recordar que cantdias tiene los días de servicio más el proporcional
		
		--print 'fecha de alta: '+ cast(@Fecha_de_Alta_Servicio as varchar) + '   fecha de baja: '+ cast(@Fecha_de_baja_Servicio as varchar)
		--print 'parámetros de periodos vacacionales'
		--print @v1i
		--print @v1f
		--print @v2i
		--print @v2f
		
		set @Fecha_de_Baja_Servicio = dateadd(dd,@cantdias,@Fecha_de_Alta_Servicio)
		--print ' cant.Dias con el proporcional incluido:  ' + cast( @cantDias as varchar)
		if @Fecha_de_Alta_Servicio > @maximo 	
		   begin			set @CantDiasAcumulados=@CantDiasAcumulados + datediff(dd,@Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio)			set @minimo=@Fecha_de_Alta_Servicio			set @maximo=@Fecha_de_Baja_Servicio		   end
		else 
		begin
			-- si estoy aca quiere decir que la fecha de designacion es mayor 			-- que el minimo y menor que el maximo			-- me fijo que pasa con la de baja			-- si es mayor al maximo tengo que acumular la diferencia entre 			-- maximo y baja y cambiar el maximo			-- si es menor o igual al maximo no tengo que hacer nada
		 	set @calculo=1
			if @Fecha_de_Baja_Servicio > @maximo
				begin
					-- acumulo la diferencia y actualizo el maximo
					set @CantDiasAcumulados = @CantDiasAcumulados + datediff(dd,@maximo,@Fecha_de_Baja_Servicio)
					set @maximo=@Fecha_de_Baja_Servicio
				end
		end
		FETCH NEXT FROM c INTO @Fecha_de_Alta_Servicio,@Fecha_de_Baja_Servicio

	--print 'cantDias acumulados' + cast(@CantDiasAcumulados as varchar)
	--print' '
	--print'--  fin     -----------------'
END --del while del cursor

	CLOSE c
	DEALLOCATE c 

	set @ASCargo = @CantDiasAcumulados

	If @ASCargo % 365 >= 183 
	        set @ASCargo =  floor(@ASCargo / 365) + 1
	        Else
	        set @ASCargo = floor (@ASCargo / 365)

	SET @Calculo = @ASCargo
	EXEC @PuntajeCargo = sp_minimo @topeServiciosEnElCargo, @Calculo
	SET @Puntaje=@PuntajeCargo
print @puntaje
--END  -- del if @idTipoConvocatoria = 1 

--ELSE
--	begin
--		insert tb_registroeventos (fecha,idusuario1,severidad,causa,idusuario2,descripcion) values (getdate(),suser_id(),0,'puntajes por Actuaciones en Conciertos o recitales',suser_id(),'No se valoran cursos para el tipo de convocatoria '+str(@idtipoconvocatoria))
--		set @resultado =1
--	end

--print 'Años de servicio en la Modalidad ' + cast(@modalidad as varchar) + '  : ' + cast(@ASModalidad as varchar)
Salir:
IF @Error <> 0 
	ROLLBACK TRANSACTION
ELSE 
	COMMIT TRANSACTION
GO
GRANT EXECUTE ON  [dbo].[pje_porAnosDeServiciosTecnicos] TO [Juntas]
GO
